#include "board.h"   
#include "bsp_gpio.h"   

#define GPIO_PORT 	0 
#define GPIO_MODE   1 
#define GPIO_IO 	2 

uint32_t gpioCofig[][3] = 
{      		
	// {(uint32_t)GPIOA,GPIO_Mode_Out_PP,GPIO_Pin_11},	
	{(uint32_t)GPIOE,GPIO_Mode_Out_PP,GPIO_Pin_2},		//	GPIO_WDI         			      			        			
	{(uint32_t)GPIOA,GPIO_Mode_Out_PP,GPIO_Pin_15},		//	GPIO_MDU_LED
	// {(uint32_t)GPIOC,GPIO_Mode_Out_PP,GPIO_Pin_13},
	// {(uint32_t)GPIOB,GPIO_Mode_Out_PP,GPIO_Pin_0},		//	GPIO_HX711_SCK
	// {(uint32_t)GPIOB,GPIO_Mode_IPU,GPIO_Pin_1},		//	GPIO_HX711_DT
};

/*函数声明*/  
//void static motorXmTick(void);
//void static motorCdTick(void);
// void motorTick(u8 *mode,uint32_t *Pulse,u8 *state,u8 *dir,u8 gpioEn,u8 gpioDir,u8 gpioStep,u8 stopMin,u8 StopMax);
// void PidBmotorTick(void);
//void handle_power_key(void);
void EXTIX_Init(void);
/*
gpio:需要控制的GPIO，需要在枚举表中定义对应的值
*/
void GpioSet(uint8_t gpio,uint8_t state)
{
//	rt_enter_critical();
	if(state == 0) 
	{
		GPIO_ResetBits((GPIO_TypeDef *)gpioCofig[gpio][GPIO_PORT],gpioCofig[gpio][GPIO_IO]);
	}
	else {
		GPIO_SetBits((GPIO_TypeDef *)gpioCofig[gpio][GPIO_PORT],gpioCofig[gpio][GPIO_IO]);
	}
//	rt_exit_critical();

}
/*
gpio:获取对于GPIO的状态
*/
uint8_t GpioGet(uint8_t gpio)
{

	return GPIO_ReadInputDataBit((GPIO_TypeDef *)gpioCofig[gpio][GPIO_PORT],gpioCofig[gpio][GPIO_IO]);


}
 /**
  * @brief  初始化控制LED的IO
  * @param  无
  * @retval 无
  */
void GPIO_Config(void)
{		
		/*定义一个GPIO_InitTypeDef类型的结构体*/
		GPIO_InitTypeDef GPIO_InitStructure;
		u8 RegNum = sizeof(gpioCofig)/3/4;

		/*开启LED相关的GPIO外设时钟*/
		RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |  RCC_APB2Periph_GPIOC  | RCC_APB2Periph_GPIOD  | RCC_APB2Periph_GPIOE , ENABLE);
		//禁用JTAG功能，释放PB3/PB4引脚
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);
		GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
		while ( RegNum  > 0)
		{
			RegNum -- ;
			/*选择要控制的GPIO引脚*/
			GPIO_InitStructure.GPIO_Pin = gpioCofig[RegNum][GPIO_IO];	
			
			/*设置引脚模式为通用推挽输出*/
			GPIO_InitStructure.GPIO_Mode = gpioCofig[RegNum][GPIO_MODE];   
			
						/*设置引脚速率为50MHz */   
			GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
				
						/*调用库函数，初始化GPIO*/
			GPIO_Init((GPIO_TypeDef *)gpioCofig[RegNum][GPIO_PORT], &GPIO_InitStructure);	
			
			//GPIO_SetBits((GPIO_TypeDef *)gpioCofig[RegNum][GPIO_PORT],gpioCofig[RegNum][GPIO_IO]);
		
		}
		//外部中断配置
		EXTIX_Init();

}
void gpio_set_dir(uint8_t gpio,uint32_t GMODE)
{
		GPIO_InitTypeDef GPIO_InitStructure;

		/*开启LED相关的GPIO外设时钟*/
		RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |  RCC_APB2Periph_GPIOC  | RCC_APB2Periph_GPIOD  | RCC_APB2Periph_GPIOE , ENABLE);

		GPIO_InitStructure.GPIO_Pin = gpioCofig[gpio][GPIO_IO];	

		/*设置引脚模式为通用推挽输出*/
		GPIO_InitStructure.GPIO_Mode = GMODE;   

//				/*设置引脚速率为50MHz */   
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 

				/*调用库函数，初始化GPIO*/
		GPIO_Init((GPIO_TypeDef *)gpioCofig[gpio][GPIO_PORT], &GPIO_InitStructure);	


}

//通用定时器中断初始化
//这里时钟选择为APB1的2倍，而APB1为36M
//arr：自动重装值。
//psc：时钟预分频数
//这里使用的是定时器3!
void TIM4_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //时钟使能

	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	 计数到50为5ms
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  100Khz的计数频率  
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
 
	TIM_ITConfig(  //使能或者失能指定的TIM中断
		TIM4, //TIM2
		TIM_IT_Update ,
		ENABLE  //使能
		);
	NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;  //TIM3中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;  //从优先级3级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
	NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

	TIM_Cmd(TIM4, ENABLE);  //使能TIMx外设
							 
}
void TIM4_IRQHandler(void)   //TIM3中断
{
	if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
		{
		TIM_ClearITPendingBit(TIM4, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源
		
//			RGB_LED1_Write_24Bits(0,0xff,0xff,26,0xff,0,0,26);
//			RGB_LED2_Write_24Bits(0,0xff,0xff,26,0xff,0,0,26);
		}
}
//通用定时器中断初始化
//这里时钟选择为APB1的2倍，而APB1为36M
//arr：自动重装值。
//psc：时钟预分频数
//这里使用的是定时器3!
void TIM3_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能

	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	 计数到50为5ms
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  100Khz的计数频率  
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
 
	TIM_ITConfig(  //使能或者失能指定的TIM中断
		TIM3, //TIM2
		TIM_IT_Update ,
		ENABLE  //使能
		);
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
	NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

	TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设
							 
}


extern _Main_t mainPar;
uint8_t timePulse = 0;
 void TIM3_IRQHandler(void)   //TIM3中断
 {
 	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 
 		{
 		TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx的中断待处理位:TIM 中断源
// //		
// //			RGB_LED1_Write_24Bits(0xff,0xff,0xff,50,0,0xff,0,50);
// 		timePulse ++;//不进行判断，加快中断速度，变量会自动从0到255再到0
		
	
// //		motorTick(&mainPar.motor.bAxisMode,\
// //					&mainPar.motor.bAxisPulse,\
// //					&mainPar.motor.bAxisState,\
// //					&mainPar.motor.bAxisDir,\
// //					GPIO_U_EN,\
// //					GPIO_U_DIR,\
// //					GPIO_U_STEP,\
// //					0,\
// //					GPIO_SMID_DI);
// 		PidBmotorTick();
// 		motorTick(&mainPar.motor.cdMode,\
// 					&mainPar.motor.cdPulse,\
// 					&mainPar.motor.cdState,\
// 					&mainPar.motor.cdDir,\
// 					GPIO_CD_EN,\
// 					GPIO_CD_DIR,\
// 					GPIO_CD_STEP,\
// 					GPIO_CD_MIN_DI,\
// 					GPIO_CD_MAX_DI);
// 		motorTick(&mainPar.motor.xmMode,\
// 					&mainPar.motor.xmPulse,\
// 					&mainPar.motor.xmState,\
// 					&mainPar.motor.xmDir,\
// 					GPIO_XM_EN,\
// 					GPIO_XM_DIR,\
// 					GPIO_XM_STEP,\
// 					GPIO_XM_MIN_DI,\
// 					GPIO_XM_MAX_DI);
// 		motorTick(&mainPar.motor.EMode,\
// 					&mainPar.motor.EPulse,\
// 					&mainPar.motor.EState,\
// 					&mainPar.motor.EDir,\
// 					GPIO_EN_MCU,\
// 					GPIO_DIR_MCU,\
// 					GPIO_STEP_MCU,\
// 					0,\
// 					0);						
			
// 		mainPar.timtick ++;
 	}
 }

extern  _Main_t mainPar;
/*
运动电机motor：1:铲刀电机  2：卸模板电机
运动模式mode：0:停止运动模式 1:指定脉冲数量运动模式  2：指定方向限位停止模式 3：依靠脉冲数量同时检测限位
运动方向dir:0:CW方向 1:CCW方向
运动脉冲pulse：电机被制定运行模式时的运行脉冲数量
*/
// void mootorRunSet(uint8_t motor,uint8_t mode,uint8_t dir,uint32_t pulse) 
// {
// 	if(motor == MOTOR_CD)
// 	{
// 		mainPar.motor.cdMode = mode;
// 		mainPar.motor.cdDir = dir;
// 		mainPar.motor.cdPulse = pulse*2;//一个脉冲需要两次中断才可以完成
// 		mainPar.motor.cdState = MOTOR_STATE_RUN;
// 	}
// 	else if(motor == MOTOR_XM)
// 	{
// 		mainPar.motor.xmMode = mode;
// 		mainPar.motor.xmDir = dir;
// 		mainPar.motor.xmPulse = pulse*2;
// 		mainPar.motor.xmState = MOTOR_STATE_RUN;
// 	}
// 	else if(motor == MOTOR_BAXIS)
// 	{
// 		mainPar.motor.bAxisMode = mode;
// 		mainPar.motor.bAxisDir = dir;
// 		mainPar.motor.bAxisPulse = pulse*2;
// 		mainPar.motor.bAxisState = MOTOR_STATE_RUN;
		
// //		rt_kprintf("mode:%d pulse:%d dir:%d\r\n",mode,pulse,dir);
// 	}
// 	else if(motor == MOTOR_E)
// 	{
// 		mainPar.motor.EMode = mode;
// 		mainPar.motor.EDir = dir;
// 		mainPar.motor.EPulse = pulse*2;
// 		mainPar.motor.EState = MOTOR_STATE_RUN;
		
// //		rt_kprintf("mode:%d pulse:%d dir:%d\r\n",mode,pulse,dir);
// 	}
	
// }
uint16_t mabs(int32_t value)
{
	if( value > 0)
		return value;
	else 
		return -value;

}
// float PID_p = 0.5;
// uint8_t levell = 0; //归平状态流程
// void PidBmotorTick()
// {
// 	int32_t buff= 0;  //临时参数使用
// 	uint16_t P = 0;
// 	uint8_t MaxSpeed = 100;

// 	//如果为1，需要进行调平运动
// 	//先运动到中间红外为止，再进行一定距离的回调，再进行慢速的回正，确保精度
// 	if(mainPar.tableLevellSta == 1)
// 		{
// 			//开始向中间运动
// 			if(levell == 0)
// 			{
// 				//正常速度运动到限位生效
// 				if(GpioGet(GPIO_SMID_DI) == 0 )
// 				{
// 					mainPar.motor.bAddPulse -= 200;
// 				}
// 				//如果接触到限位
// 				else if(GpioGet(GPIO_SMID_DI) == 1)
// 				{
// 					mainPar.motor.bAddPulse = 0;
// 					mainPar.motor.bAxisPulse = 0;
// 					mainPar.motor.bAddPulse += 3000;
// 					levell = 1;//进行低速归位状态
// 				}
// 			}
// 			else if(levell == 1)
// 			{
// 				//看反向运动是否到位
// 				if((mainPar.motor.bAddPulse - mainPar.motor.bAxisPulse) <= 1 )
// 				{
// 					levell = 2;
// 				}
// 			}
// 			//低速运动到限位位置
// 			else if(levell == 2)
// 			{
// 				//正常速度运动到限位生效
// 				if(GpioGet(GPIO_SMID_DI) == 0 )
// 				{
// 					mainPar.motor.bAddPulse = -95;
// 				}
// 				//如果接触到限位，停止运动
// 				else if(GpioGet(GPIO_SMID_DI) == 1)
// 				{
// 					mainPar.motor.bAxisPulse = 0;
// 					mainPar.motor.bAddPulse = 0;
// 					levell = 0;//进行低速归位状态
// 					mainPar.tableLevellSta = 2;//完成限位操作
// 				}
// 			}
		
// 		}
		
// 		//正常pid调节
// 		mainPar.motor.bSpeedTick ++;
// 		if(mainPar.motor.bSpeedTick >= (MaxSpeed-mainPar.motor.bSpeed))
// 		{
// 			mainPar.motor.bSpeedTick = 0;
// 			mainPar.motor.bstepTick ++;	
// 			//判断误差
// 			buff = mainPar.motor.bAxisPulse - mainPar.motor.bAddPulse;
// 			//误差超限
// 			if((buff < -1)||(buff > 1))
// 				{
// 					if(buff > 0)
// 					{
// 						GpioSet(GPIO_U_DIR,0);//度数增大方向
// 						mainPar.motor.bAddPulse ++;
// 					}
// 					else 
// 					{
// 						GpioSet(GPIO_U_DIR,1);//度数减小方向
// 						mainPar.motor.bAddPulse --;
// 					}
// 					P = mabs(buff) * PID_p;
// 					if(P >= 100) P = 100;
// 					mainPar.motor.bSpeed = P;
// 					GpioSet(GPIO_U_STEP,(mainPar.motor.bstepTick%2));
// 				}	
// 			//不用进行调整
// 			else {
// 				P = 0;
// 				mainPar.motor.bAxisMode = MOTOR_MODE_STOP;
// 			}	
// 		}
// }
// void motorTick(u8 *mode,uint32_t *Pulse,u8 *state,u8 *dir,u8 gpioEn,u8 gpioDir,u8 gpioStep,u8 stopMin,u8 StopMax)
// {
// //		timePulse ++;//不进行判断，加快中断速度，变量会自动从0到255再到0

// 		//铲刀电机的控制
// 		//电机立即停机
// 		if(*mode == MOTOR_MODE_STOP)
// 		{
// 			GpioSet(gpioEn,1);
// 			GpioSet(gpioStep,1);
// 			//GpioSet(GPIO_CD_STEP,1); //以免意外给出脉冲，造成偏移
// 			//*dir = 0;
// 		}
// 		//依靠脉冲数量模式
// 		else if(*mode == MOTOR_MODE_PULSE)
// 		{
// 			//如果脉冲数量不为0，就进行控制
// 			if(*Pulse != 0)
// 			{
// 				GpioSet(gpioEn,0);
// 				GpioSet(gpioDir,*dir);
// 				GpioSet(gpioStep,(timePulse%2));//根据取模结果进行脉冲的发送
// 				(*Pulse) --;
// //				rt_kprintf("*Pulse:%d\r\n",*Pulse);
// 			}
// 			else {
// 				*mode = MOTOR_MODE_STOP;
// 				*state = MOTOR_STATE_PULSE_OK;//标记为脉冲停止状态
// 			}

// 		}
// 		//依靠限位停止模式
// 		else if(*mode == MOTOR_MODE_EXTER)
// 		{
// 			//判断控制方向以及需要检测的限位是否完成
// 			if(*dir == MOTOR_DIR_CCW)
// 			{
// 				if(GpioGet(StopMax) == 0)//如果限位错误，修改该处定义
// 				{
// 					GpioSet(gpioEn,0);
// 					GpioSet(gpioDir,*dir);
// 					GpioSet(gpioStep,(timePulse%2));
// 				}
// 				else {
// 					*mode = MOTOR_MODE_STOP;
// 					*state = MOTOR_STATE_EXTER_OK;//标记为限位停止状态
// 				}
// 			}
// 			else if(*dir == MOTOR_DIR_CW)
// 			{
// 				if(GpioGet(stopMin) == 0)//如果限位错误，修改该处定义
// 				{
// 					GpioSet(gpioEn,0);
// 					GpioSet(gpioDir,*dir);
// 					GpioSet(gpioStep,(timePulse%2));
// 					//对相应电机位置进行记录
// //					motorAdd(mode,*dir);
// 				}
// 				else {
// 					*mode = MOTOR_MODE_STOP;
// 					*state = MOTOR_STATE_EXTER_OK;//标记为限位停止状态
// 				}
// 			}
// 			else {
// 					*state = MOTOR_STATE_ERR;//参数错误
// 				}
			
// 		}
// 		//依靠脉冲并且检测限位模式
// 		else if(*mode == MOTOR_MODE_EXTER_PULSE)
// 		{	
// 			if(*Pulse != 0)
// 			{
// 				*Pulse --;
// 				//判断控制方向以及需要检测的限位是否完成
// 				if(*dir == MOTOR_DIR_CW)
// 				{
// 					if(GpioGet(StopMax) == 1)//如果限位错误，修改该处定义
// 					{
// 						GpioSet(gpioEn,0);
// 						GpioSet(gpioDir,*dir);
// 						GpioSet(gpioStep,(timePulse%2));
// 					}
// 					else {
// 						*mode = MOTOR_MODE_STOP;
// 						*state = MOTOR_STATE_EXTER_OK;//标记为限位停止状态
// 					}
// 				}
// 				else if(*dir == MOTOR_DIR_CCW)
// 				{
// 					if(GpioGet(stopMin) == 1)//如果限位错误，修改该处定义
// 					{
// 						GpioSet(gpioEn,0);
// 						GpioSet(gpioDir,*dir);
// 						GpioSet(gpioStep,(timePulse%2));
// 					}
// 					else {
// 						*mode = MOTOR_MODE_STOP;
// 						*state = MOTOR_STATE_EXTER_OK;//标记为限位停止状态
// 					}
// 				}
// 				else {
// 					*state = MOTOR_STATE_ERR;
// 				}
// 			}
// 			else {
// 				*mode = MOTOR_MODE_STOP;
// 				*state = MOTOR_STATE_PULSE_OK;//标记为脉冲停止状态
// 			}
// 		}
// 		else {
// 		*state = MOTOR_STATE_ERR;//参数错误
// 		}
// }
/*外部电机信号切换
挤出机模式mode：1：使用1号耗材进行挤出2：使用2号进行挤出
挤出机信号源sig:0：外部输入信号1：内部控制信号
*/
// void EMotorSIgSet(u8 mode,u8 sig)
// {

	
// 	//电机信号源的切换
// 	if(sig == EMOTOR_EXTERNAL)//切换到外置信号驱动
// 	{
// 		GpioSet(GPIO_MOTOR_SIG_EN,1);//切换为y通道
// 	}
// 	else if(sig == EMOTOR_MCU)//切换到内置信号驱动
// 	{
// 		GpioSet(GPIO_MOTOR_SIG_EN,0);//切换为x通道
// 	}
// 	//切换为内置信号
// 	else{
// 		GpioSet(GPIO_MOTOR_SIG_EN,0);//切换为x通道
// 	}
	
// 	//电机控制信号通路的切换
// 	//高电平切换为
// 	if(mode == EMOTOR_EXT1)
// 	{
// 		//该处为硬件PCB的引脚网络名称错误
// 		GpioSet(GPIO_MOTOR_JD_EN,0);//1.1版本为耗材2开关
// 		GpioSet(GPIO_MOTOR_YD1_EN,1);//1.1版本为耗材1开关
// 		GpioSet(GPIO_MOTOR_YD2_EN,1);//1.1版本为近端开关
// 	}
// 	else if(mode == EMOTOR_EXT2)
// 	{
// 			GpioSet(GPIO_MOTOR_JD_EN,1);
// 			GpioSet(GPIO_MOTOR_YD1_EN,0);//关闭1号电机动作
// 			GpioSet(GPIO_MOTOR_YD2_EN,1);
	
// 	}
// 	//关闭全部信号通道
// 	else {
// 			GpioSet(GPIO_MOTOR_JD_EN,0);
// 			GpioSet(GPIO_MOTOR_YD1_EN,0);
// 			GpioSet(GPIO_MOTOR_YD2_EN,0);
// 	}
	
// }
/*
控制挤出机的运动方式
运行模式mode：
1：使用外接信号驱动1号耗材箱
2：使用外接信号驱动2号耗材箱
11:1号耗材退回到耗材箱
12:2号耗材退回到耗材箱
31：推送1号耗材到打印头处
32：推送2号耗材到打印头处
*/
// void EMotorMode(u8 mode)
// {
// 	if(mode == 1)
// 	{
// 		EMotorSIgSet(1,EMOTOR_EXTERNAL);
// 	}
// 	else if(mode == 2)
// 	{
// 		EMotorSIgSet(2,EMOTOR_EXTERNAL);
// 	}
// 	else if(mode == 11)
// 	{
// 		//切换为1号耗材，切换为MCU信号
// 		EMotorSIgSet(1,EMOTOR_MCU);
// 		//检测耗材是否就位，然后推送耗材指定的脉冲数
// 		//if（）
		
// 		mootorRunSet(MOTOR_E,MOTOR_MODE_PULSE,MOTOR_E_DIR_OUTPUT,500) ;
// 	}
// 	else if(mode == 12)
// 	{
// 		//切换为1号耗材，切换为MCU信号
// 		EMotorSIgSet(2,EMOTOR_MCU);
// 		//检测耗材是否就位，然后推送耗材指定的脉冲数
// 		//if（）
// 		mootorRunSet(MOTOR_E,MOTOR_MODE_PULSE,MOTOR_E_DIR_OUTPUT,1000) ;
// 	}
// 	else if(mode == 31)
// 	{
// 		//切换为1号耗材，切换为MCU信号
// 		EMotorSIgSet(1,EMOTOR_MCU);
// 		//检测耗材是否就位，然后推送耗材指定的脉冲数
// 		//if（）
// 		mootorRunSet(MOTOR_E,MOTOR_MODE_PULSE,MOTOR_E_DIR_INTPUT,500) ;
// 	}
// 	else if(mode == 32)
// 	{
// 		//切换为1号耗材，切换为MCU信号
// 		EMotorSIgSet(2,EMOTOR_MCU);
// 		//检测耗材是否就位，然后推送耗材指定的脉冲数
// 		//if（）
// 		mootorRunSet(MOTOR_E,MOTOR_MODE_PULSE,MOTOR_E_DIR_INTPUT,1000) ;
// 	}


// }

// // 处理按键事件，处理开机/关机逻辑
// void handle_power_key(void) {
//     uint8_t keyState = GpioGet(GPIO_MCU_POWRER_KEY_IN); // 1:按下，0:松开（下拉输入）
//     uint32_t currentTick = rt_tick_get();
// 	static uint32_t s_keyPressTick = 0; // 按键按下时间戳
// 	uint8_t i = 1;

// 	if(GpioGet(GPIO_MCU_POWER_ON) == 0){//关机状态下的按键处理逻辑
// 		if (keyState) { // 按键按下（上升沿触发）
// 			GpioSet(GPIO_MCU_POWER_ON, 1); // 开机，拉高电源输出引脚，按键断开之后使继电器持续供电
// 			writeMdodbusReg(Mreg_Key_POWER, 0); // 状态复位为未按下
// 		} 
// 	}
// 	else if(GpioGet(GPIO_MCU_POWER_ON) == 1){//开机状态下的按键处理逻辑
// 		if (keyState) { // 按键按下（上升沿触发）
// 			if(i){
// 				s_keyPressTick = currentTick; // 记录按下时间
// 				i--;
// 			}
// 		}else { // 按键松开
// 			i = 1;
// 			uint32_t pressDuration = currentTick - s_keyPressTick;
// 			if (pressDuration >= 3000) { // 按3秒：关机
// 				s_keyPressTick = 0; // 重置时间戳
// 				writeMdodbusReg(Mreg_Key_POWER, 1);
// 				rt_thread_delay(2000); // 延迟2秒后关机
// 				GpioSet(GPIO_MCU_POWER_ON, 0); // 关机，拉低电源输出引脚，按键断开之后继电器停止供电	
// 			}
//     	}
// 	}
// }

#define		RGB_LED_HIGH	GPIOD->BSRR = GPIO_Pin_10;
#define 		RGB_LED_LOW		GPIOD->BRR = GPIO_Pin_10;
/********************************************************/
//
/********************************************************/
void RGB_LED_Write0(void)
{
	RGB_LED_HIGH;
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	RGB_LED_LOW;
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();
}

/********************************************************/
//
/********************************************************/

void RGB_LED_Write1(void)
{
	RGB_LED_HIGH;
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();
	RGB_LED_LOW;
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();
}

void RGB_LED_Write_Byte(uint8_t byte)
{
	uint8_t i;

	for(i=0;i<8;i++)
		{
			if(byte&0x80)
				{
					RGB_LED_Write1();
			}
			else
				{
					RGB_LED_Write0();
			}
		byte <<= 1;
	}
}
//芯片复位，发送数据后，拉低数据线，让数据开始显示
void Led_Reset()
{
	uint16_t i = 80;
	RGB_LED_LOW;
	while(i--)	{ 
	__ASM("NOP");
	}
//		RGB_LED_HIGH;
}
void RGB_LED1_Write_24Bits(uint8_t green1,uint8_t red1,uint8_t blue1,uint16_t num1,uint8_t green2,uint8_t red2,uint8_t blue2,uint16_t num2)
{

	rt_enter_critical();
	
	while(num1--)
	{
		RGB_LED_Write_Byte(green1);
		RGB_LED_Write_Byte(red1);
		RGB_LED_Write_Byte(blue1);
	}
	while(num2--)
	{
		RGB_LED_Write_Byte(green2);
		RGB_LED_Write_Byte(red2);
		RGB_LED_Write_Byte(blue2);
	}
			Led_Reset();

	rt_exit_critical();
}
#define		RGB_LED2_HIGH	GPIOD->BSRR = GPIO_Pin_12;
#define 		RGB_LED2_LOW		GPIOD->BRR = GPIO_Pin_12;
/********************************************************/
//
/********************************************************/
void RGB_LED2_Write0(void)
{
	RGB_LED2_HIGH;
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	RGB_LED2_LOW;
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();
}

/********************************************************/
//
/********************************************************/

void RGB_LED2_Write1(void)
{
	RGB_LED2_HIGH;
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();
	RGB_LED2_LOW;
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();__nop();
	__nop();__nop();
}

void RGB_LED2_Write_Byte(uint8_t byte)
{
	uint8_t i;

	for(i=0;i<8;i++)
		{
			if(byte&0x80)
				{
					RGB_LED2_Write1();
			}
			else
				{
					RGB_LED2_Write0();
			}
		byte <<= 1;
	}
}
//芯片复位，发送数据后，拉低数据线，让数据开始显示
void Led2_Reset()
{
	uint16_t i = 80;
	RGB_LED2_LOW;
	while(i--)	{ 
	__ASM("NOP");
	}
//		RGB_LED_HIGH;
}
void RGB_LED2_Write_24Bits(uint8_t green1,uint8_t red1,uint8_t blue1,uint16_t num1,uint8_t green2,uint8_t red2,uint8_t blue2,uint16_t num2)
{

	rt_enter_critical();
	
	while(num1--)
	{
		RGB_LED2_Write_Byte(green1);
		RGB_LED2_Write_Byte(red1);
		RGB_LED2_Write_Byte(blue1);
	}
	while(num2--)
	{
		RGB_LED2_Write_Byte(green2);
		RGB_LED2_Write_Byte(red2);
		RGB_LED2_Write_Byte(blue2);
	}
			Led2_Reset();

	rt_exit_critical();
}
/*外部中断的配置*/
//外部中断0服务程序
void EXTIX_Init(void)
{
 
 	EXTI_InitTypeDef EXTI_InitStructure;
 	NVIC_InitTypeDef NVIC_InitStructure;

//    KEY_Init();	 //	按键端口初始化

  	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);	//使能复用功能时钟

   //GPIOE.0	  中断线以及中断初始化配置  上升沿触发	//KEY0
  	GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource0);
	EXTI_InitStructure.EXTI_Line=EXTI_Line0;	//KEY0
  	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;	
  	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  	EXTI_Init(&EXTI_InitStructure);	 	//根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器


  	NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;			//使能按键WK_UP所在的外部中断通道
  	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;	//抢占优先级2， 
  	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;					//子优先级3
  	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;								//使能外部中断通道
  	NVIC_Init(&NVIC_InitStructure); 

   //GPIOC.12	  中断线以及中断初始化配置  上升沿触发	//KEY0
  	GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource12);
	EXTI_InitStructure.EXTI_Line=EXTI_Line12;	//KEY0
  	EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;	
  	EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  	EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  	EXTI_Init(&EXTI_InitStructure);	 	//根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器


  	NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;			//使能按键WK_UP所在的外部中断通道
  	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;	//抢占优先级2， 
  	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;					//子优先级3
  	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;								//使能外部中断通道
  	NVIC_Init(&NVIC_InitStructure);
	
	//GPIOD.4	  中断线以及中断初始化配置  上升沿触发	//GPIO_MCU_POWRER_KEY_IN
	// 配置EXTI线路
	// GPIO_EXTILineConfig(GPIO_PortSourceGPIOD, GPIO_PinSource4);
	// EXTI_InitStructure.EXTI_Line = EXTI_Line4;
	// EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	// EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; // 选择触发方式
	// EXTI_InitStructure.EXTI_LineCmd = ENABLE;
	// EXTI_Init(&EXTI_InitStructure);

	// NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn; 
    // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
    // NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00;
    // NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    // NVIC_Init(&NVIC_InitStructure);
 
}

//外部中断4服务程序
// void EXTI4_IRQHandler(void) {
//     if (EXTI_GetITStatus(EXTI_Line4) != RESET) {
// 		EXTI_ClearITPendingBit(EXTI_Line4);
// 		handle_power_key(); // 处理开机按键事件
//     }
// }

//外部中断4服务程序
// void EXTI4_IRQHandler(void) {
//     if (GpioGet(GPIO_MCU_POWRER_KEY_IN) == 1) {
// 		mainPar.keyState = GpioGet(GPIO_MCU_POWRER_KEY_IN); // 读取按键状态，1为按下
// 	}
// 	EXTI_ClearITPendingBit(EXTI_Line4);//清除LINE4上的中断标志位
// }


//外部中断0服务程序 
//void EXTI0_IRQHandler(void)
//{
////	delay_ms(10);//消抖
//	if(GpioGet(GPIO_GRATING)==1)	 	 //卸模光栅被中断
//	{				 
//		writeMdodbusReg(Mreg_Grating,1);
////		LED1=!LED1;	
//	}
//	EXTI_ClearITPendingBit(EXTI_Line0); //清除LINE0上的中断标志位  
//}
// void EXTI15_10_IRQHandler(void)
// {
// //	delay_ms(10);//消抖
// 	if(GpioGet(GPIO_FILAMENT)==1)	 	 //WK_UP按键
// 	{				 
// //		writeMdodbusReg(Mreg_UnloadRaster,1);
// //		LED1=!LED1;	
// 		mainPar.FilaTick ++; 
// 	}
// 	EXTI_ClearITPendingBit(EXTI_Line12); //清除LINE0上的中断标志位  

// }
